<?php

use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;

// 统计字数
if (!function_exists('count_words'))
{
    function count_words($text)
    {
        // 使用正则表达式将文本中的单词和中文字符分开
        preg_match_all('/\b\w+\b/', $text, $words);
        preg_match_all('/[\x{4e00}-\x{9fff}]/u', $text, $chineseChars);
        return count($words[0]) + count($chineseChars[0]);
    }
}

// 检测媒体文件
if (!function_exists('check_media_file'))
{
    function check_media_file($mediaFile)
    {
        if (!file_exists($mediaFile)) {
            return false;
        }

        // 构建 FFmpeg 命令
        $command = "ffmpeg -v error -i " . escapeshellarg($mediaFile) . " -f null - 2>&1";

        // 执行命令并捕获输出
        $output = [];
        $returnVar = null;
        exec($command, $output, $returnVar);
        // 如果返回值为0，说明音频文件没有错误
        if ($returnVar === 0) {
            return true;
        } else {
            // 如果返回值不为0，说明音频文件有错误
            return false;
        }
    }
}

// 合并音频
if (!function_exists('merge_audio'))
{
    function merge_audio($audio_list, $output_file): bool
    {
        if (empty($audio_list)) {
            return false;
        }

        for ($i = 0; $i < 3; $i++) {
            $temp_file = 'audio_list_' . Str::random(40) . '.txt';
            if (Storage::disk('local')->exists($temp_file)) {
                $is_exist = true;
            } else {
                $is_exist = false;
                break;
            }
        }
        if ($is_exist) {
            return false;
        }

        // 写入文件列表到临时文件
        foreach ($audio_list as $file) {
            Storage::disk('local')->append($temp_file, "file '$file'");
        }

        $file_path = storage_path('app') . DIRECTORY_SEPARATOR . $temp_file;
        $command = "ffmpeg -f concat -safe 0 -i " . escapeshellarg($file_path) . " -c copy -y $output_file";
        exec($command, $output, $returnVar);

        Storage::disk('local')->delete($temp_file);

        if ($returnVar === 0) {
            return true;
        }

        return false;
    }
}

if (!function_exists('get_media_duration')) {
    function get_media_duration($filePath)
    {
        if (!file_exists($filePath)) {
            return false;
        }
        $command = 'ffprobe -i ' . escapeshellarg($filePath) . ' -show_entries format=duration -v quiet -of csv="p=0"';
        // 执行命令并捕获输出
        $output = [];
        $returnVar = null;
        exec($command, $output, $returnVar);
        // 如果返回值为0，说明音频文件没有错误
        if ($returnVar === 0) {
            return floatval($output[0]);
        } else {
            // 如果返回值不为0，说明音频文件有错误
            return false;
        }
    }
}

// 添加背景音
if (!function_exists('mixture_audio'))
{
    function mixture_audio($main_audio, $background_audio, $output_audio, $volume = 0.5)
    {
        $command = "ffmpeg -i " . escapeshellarg($main_audio) ." -stream_loop -1 -i " . escapeshellarg($background_audio) . " -filter_complex \"[1]volume=" . $volume . "[a1];[0][a1]amix=inputs=2:duration=first:dropout_transition=2\" -c:a libmp3lame -q:a 2 -y " . escapeshellarg($output_audio);

        exec($command, $output, $returnVar);
        if ($returnVar === 0) {
            return true;
        }

        return false;
    }
}


if (!function_exists('parse_table'))
{
    function parse_table($text): array
    {
        $lines = explode("\n", trim($text));

        // 只处理用|分隔的行
        $table_data = [];
        foreach ($lines as $line) {
            if (empty($line)) {
                continue;
            }
            if (stripos($line, '|') === false) {
                continue;
            }
            $table_data[] = $line;
        }
        $headers = [];
        $data = [];
        foreach ($table_data as $index => $value) {
            $value = trim(trim($value, '|'));
            $cells = array_map('trim', explode('|', $value));

            if ($index == 0) {
                $headers = $cells;
            } elseif ($index > 1) {
                $row = [];
                foreach ($cells as $key => $cell) {
                    $row[$headers[$key]] = $cell;
                }
                $data[] = $row;
            }
        }
        return $data;
    }
}

if (!function_exists('contains_chinese'))
{
    function contains_chinese($string): bool|int
    {
        return preg_match('/[\x{4e00}-\x{9fff}]/u', $string);
    }
}

function dowload_file($url, $localPath)
{
    $readStream = fopen($url, 'r');
    Storage::disk('local')->writeStream($localPath, $readStream);
    return storage_path('app') . DIRECTORY_SEPARATOR . $localPath;
}



